package com.linewell.util.query;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.HashMap;
import java.util.Map;

/**  
 * File: QueryFactory.java
 * Description:
 * Copyright: Copyright (c) 2016
 * Company: 南威软件股份有限公司
 * CreateTime: 2016年8月8日 下午5:10:59  
 * @author zgui   
 * @version 1.0
 */

public class QueryBuilder {
	
	/**
	 * 数据集合
	 */
	private Map<String,QueryEntity> map = null;
	/**
	 * 查询方式（只支持单格式，可以是OR，AND，NOR，NOT中的一种）
	 */
	private QueryModel model;

	/**
	 * 返回集合
	 */
	private Criteria qc = new Criteria();
	/**
	 * 集合数据
	 */
	private Criteria[] qdata;
	
	public QueryBuilder(Map<String,QueryEntity> map, QueryModel model){
		this.map = map;
		this.model = model;
		this.qdata = new Criteria[map.size()];
		
	}

	/**
	 * 获取查询条件列表
	 * @return
	 */
	public Criteria queryCriteria() {

		int i = 0;
		for (Map.Entry<String, QueryEntity> entry : map.entrySet()) {
			QueryEntity entity = entry.getValue();
			Criteria criteriaand = new Criteria();
			Criteria c = new Criteria();
			this.insert(c, entity);
			criteriaand.andOperator(c);
			qdata[i] = c;
			i++;
		}
		
		if(i==0){
			return qc;
		}
		
		switch(this.model){
		
		case AND:
			qc.andOperator(this.qdata);
			break;
		case OR:
			qc.orOperator(this.qdata);
			break;
		case NOR:
			qc.norOperator(this.qdata);
			break;
		case IN:
			qc.in(this.qdata);
			break;
		case NIN:
			qc.nin(this.qdata);
			break;
		}
		return qc;
	}

	/**
	 * 增加查询条件
	 * @param c
	 * @param entity
	 */
	public void insert(Criteria c, QueryEntity entity) {

		Criteria tc = c.and(entity.getField());

		for (int i = 0; i < entity.getType().length; i++) {
			switch (entity.getType()[i]) {
			case GT:
				tc.gt(entity.getValue()[0]);
				break;
			case LT:
				tc.lt(entity.getValue()[0]);
				break;
			case GTE:
				tc.gte(entity.getValue()[0]);
				break;
			case LTE:
				tc.lte(entity.getValue()[0]);
				break;
			case IS:
				tc.is(entity.getValue()[0]);
				break;
			case REGEX:
				if(entity.getValue()[0]!=null) {
					tc.regex(entity.getValue()[0].toString());
				}
				break;
			case IN:
				tc.in(entity.getValue());
				break;
			case NIN:
				tc.nin(entity.getValue());
				break;
			case NE:
				if(entity.getValue()!=null){
					tc.ne(entity.getValue()[0]);
				}
				break;
			}
			
		}
	}

}
